package org.xb;

/**
 * @Author
 * @Description 懒汉式
 * @Date created in 10:05 2024/10/22
 */
public class Main04 {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                Person4 instance = Person4.getInstance();
                System.out.println(instance.hashCode());
            }).start();
        }
    }
}

class Person4 {
    private Person4() {
    }

    private static Person4 person;

    public static Person4 getInstance() {
        if (person == null) {
            //进行了双重校验 Double check lock  DCL这里其实还有一个问题  如果在上锁的时候 发现了指令重排
            //导致了person使用了半初始化的对象
            //因为别的线程过来的时候 这个对象是不为空的
            synchronized (Person4.class) {
                if (person == null) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    person = new Person4();
                }
            }
        }
        return person;
    }
}


